Instituto Metrópole Digital (IMD/UFRN)
PPgSW - Metodologias de Desenvolvimento de Softwares
Tópicos Avançados de Engenharia De Software III
Eduardo Luiz Gomes - Natal, Dezembro 2018
!
Eduardo Luiz, Bacharel em Administração pela Universidade Estadual do Rio Grande do Norte (UERN). Mestrando em Engenharia de Software pelo Instituto Metrópole Digital (IMD/UFRN). Trabalha como coordenador do setor de desenvolvimento de softwares da empresa Avance - Inteligência em Gestão, criando sistemas de integração e business intelligence.
GitHub: @bal699 / Linkedin: @eduardo-bal699 / Twitter: @bal699 / eduardo.luizgs@hotmail.com
!
Você criou e testou um código maravilhoso no seu ambiente de desenvolvimento, e agora você quer disponibilizar isso para o mundo.
!
Basta executar python app.py runserver em algum computador que esteja ligado a internet e acessível na porta 80 e a mágica acontece. Certo?!
!
!
!
O termo DevOps deriva da junção das palavras "desenvolvimento" (development) e "operações" (operations), sendo uma prática de engenharia de software que possui o intuito de unificar o desenvolvimento de software (Dev) e a operação de software (Ops).
Garantir o fornecimento de software com base em integração contínua, agilidade, qualidade, estabilidade com escalabilidade e elasticidade. As práticas de DevOps integram as áreas de desenvolvimento e operações dando suporte a cultura de Integração Contínua.
!
É uma prática/filosofia/cultura que colabora para que o trabalho de desenvolvimento de software seja baseado em entregas menores, porém mais frequentes, tornando o processo mais flexível, ágil e eficiente.
Nesse processo os desenvovedores juntam as pequenas alterações de código em um repositório principal compartilhado várias vezes ao dia e de forma contínua. Processos automatizados testes, validam e colocam essas alterações em produção de forma transparente tanto para os desenvolvedores quanto para os usuários.
!
De forma geral o objetivo da IC é estabelecer uma maneira consistente e automatizada de criar, empacotar e testar aplicativos.
Alguns objetivos específicos da IC:
No passado, os desenvolvedores de uma equipe podiam trabalhar isoladamente por um longo período e só juntar suas alterações à ramificação mestre quando concluíssem seu trabalho.
Dessa forma, a junção das alterações de códigos era difícil e demorada, além de resultar no acúmulo de erros sem correção por longos períodos. Estes fatores dificultavam uma distribuição de atualizações rápidas para os clientes.
Os conceitos de IC representam métodos para acelerar a entrega de novas versões de uma aplicação, e estão alinhados com as metodologias de desenvolvimento ágil.
!
Prática de desenvolvimento de software que visa tornar a integração de código mais eficiente, através de builds e testes automatizados.
!
A Entrega Contínua é uma extensão da Integração Contínua. Além das práticas da Integração Contínua, a Entrega Contínua visa garantir que o código esteja apto/pronto para entrar em ambiente de produção.
!
É uma extenssão da IC/EC. Mesmo com todos os cuidados tomados durante o processo de CI, cada ambiente está sujeito a suas particularidades e problemas podem surgir.
!
É necessário que a equipe de operações esteja atenta e saiba como proceder rapidamente para garantir a estabilidade do ambiente de produção.
Para demonstrar o processo de integração vamos necessitar de novo repositório no GitHub:
!
$ git clone https://github.com/<seu-usuario>/hands-on-node-microservices-ci.git
Para exemplificar o processo de integração contínua, vamos utilizar uma aplicação simples em Node.js:
'use strict';
require('dotenv').config()
const Hapi = require('hapi');
// Create a server with a host and port
const server = Hapi.server({
host:'0.0.0.0',
port: process.env.PORT || 8009
});
// Add the route
server.route({
method:'GET',
path:'/',
handler:function(request,h) {
return 'Hellow World';
}
});
// Start the server
async function start() {
try {
await server.start();
}
catch (err) {
console.log(err);
process.exit(1);
}
console.log('Server running at:', server.info.uri);
};
// Start Now!
start()`
// test the applicatio is running, it's mocking for now
test("Verificando página principal está acessível", () => {
expect(true).toBe(true)
})
{
"name": "avangers",
"version": "1.0.0",
"description": "Avangers",
"main": "server.js",
"scripts": {
"start": "node server.js",
"test": "jest"
},
"author": "",
"license": "ISC",
"dependencies": {
"dotenv": "^6.2.0",
"hapi": "^17.8.1",
"jest": "^23.6.0"
}
}
Antes de iniciar o processo de Build precisamos gerar o arquivo package.json.lock. Para instalar os módulos do Node digite o comando:
$ npm install
Isso irá criar o arquivo package.json.lock e pasta node_modules com os arquivos auxiliares necssários.
$ npm run test
$ npm start
!
A Heroku permite que você adicione repositórios do GitHub diretamente a plataforma para realizar o processo de CI.
!
Cada envio/push para o ramo/branch que você especificar irá implantar uma nova versão do aplicativo automaticamente.
Pipeline são como fluxos de trabalhos a serem executados quando um evento ocorre nos repositório.
Após é necessário conectar o Heroku CI a sua conta do GitHub. Assim teremos acesso as funcionalidades de integração contínua da plataforma quando uma alteração ocorrer no repositório.
O Heroku CI é um recurso PAGO da plataforma. Dessa forma é necessário cadastrar um cartão de crédito para ter acesso ao recurso. A plataorma oferece algumas horas de testes gratuitos antes da cobrança.
Um vez que temos a aplicação configurada corretamente, podemos agora realizar o commit e push do repositório para vermos a mágica acontecer.
$ git add .
$ git commit -m "Commit inicial"
$ git push
Automaticamenteo Heroku irá identificar a alteração no branch e iniciar o processo de deploy. Caso exista algum erro no processo, este será mostrado no console do pipeline
Durante o processo de build a plataforma irá procurar pelo arquivo package.json, pois é a partir dele que as dependências serão instaladas e os testes serão executados. Você pode acompanhar o processo de build e tests ao vivo pela página do Pipeline > Tests
Vamos realiar um testes simples. Vamos alterar o código da nossa aplicação, realizar o commit e push e verificar se a plataforma de CI consegue subir essas alterações corretamente.
// Add the route
server.route({
method:'GET',
path:'/',
handler:function(request,h) {
return 'Hellow World! Finalmente consegui terminar esse tutorial!';
}
});
No ínicio criamos um pipeline de Staging, que seria algo com um ambiente de "Encenação/Homologação".
Seguindo as boas práticas do CI, antes de colocar um recurso em produção é muito interessante realizar outros tipos de testes, como os testes de aceitação ou de usuabilidade.
Somente após essa aprovação é que a nova versão do aplicativo deve entrar em produção.
Assim vamos criar um novo pipeline de produção para disponibilizar nossa aplicação após os testes.
Ao criar um aplicativo de produção automaticamente irá surgir o botão Promote to productuin no painel Staging.
!
Aplicativo em produção. Esse proceso também poderia ser automatizado a partir de algumas regras, porém, para fins de demonstração, usamos o processo manual.
GitHub: @bal699 / Linkedin: @eduardo-bal699 / Twitter: @bal699 / eduardo.luizgs@hotmail.com
!